/*
任务：制作一个简单的学生信息管理系统，
包括增删改查显，计算各科成绩并排序，
最终保存到文件中。
*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define Max_Size 100

struct Student{
	char name[20];
	int age;
	int grade;
	int ID;
	double Chinese;
	double Math;
	double English;
	double Synthesis;
	double totalScore;
}students[Max_Size];//存储学生信息的数组

 struct Student stu;
   int studentCount=0;//学生的数量
   
  
// 添加学生信息
void addStudent() {
    if (studentCount >= Max_Size) {
        printf("学生信息库已满，无法再继续添加！\n");
        return;
    }

    struct Student stu; // 创建一个学生结构体实例
    printf("请输入学生姓名：");
    scanf("%19s", stu.name);//%19s:防止缓冲区溢出
    printf("请输入学生年龄：");
    scanf("%d", &stu.age);
    printf("请输入学生学号：");
    scanf("%d", &stu.ID);
    printf("请输入学生的语文成绩：");
    scanf("%lf", &stu.Chinese); // 读取语文成绩
    printf("请输入学生的数学成绩：");
    scanf("%lf", &stu.Math); // 读取数学成绩
    printf("请输入学生的英语成绩：");
    scanf("%lf", &stu.English); // 读取英语成绩
    printf("请输入学生的理综成绩：");
    scanf("%lf", &stu.Synthesis); // 读取理综成绩

    students[studentCount++] = stu;
    printf("学生信息添加成功！\n");
}

//删除学生信息
void deleteStudent(){
	if(studentCount==0){
		printf("学生库里没有信息，无法删除！\n");
		return;
	}
	int deleteID;
	int found=0;
	printf("请输入学生学号：");
	scanf("%d",&deleteID);
	for(int i=0;i<studentCount;i++){
		if(students[i].ID==deleteID){
			found=1;
				for(int j=i;j<studentCount-1;j++){
					students[j]=students[j+1];
					
				}
				studentCount--;
				printf("\n学号为%d的学生信息已删除！\n",deleteID);
				break;	
			}			
	}	
		if(!found){
			printf("没有找到学号为%d的学生信息，无法删除！\n",deleteID);
		}
}

//修改学生信息
void updateStudent(){
	if(studentCount==0){
		printf("学生库里没有信息，无法修改！\n");
		return;
	}
	int updateID;
	int found=0;
	printf("请输入你要修改的学生学号：\n");
	scanf("%d",&updateID);
	for(int i=0;i<studentCount;i++){
		if(students[i].ID==updateID){
		found=1;
		while(1){
		printf("\n请输入你要修改的内容：\n");
				printf("\n[1] 学生姓名\n");
				printf("[2] 学生年龄\n");
				printf("[3] 学生班级\n");
				printf("[4] 学生学号\n");
				printf("[5] 学生语文成绩\n");
				printf("[6] 学生数学成绩\n");
				printf("[7] 学生英语成绩\n");
				printf("[8] 学生理综成绩\n");
				printf("[0] 返回上一级\n");
				int upchoice;
				printf("请输入你的选择：\n");
				scanf("%d",&upchoice);
					switch (upchoice) {
								case 1:
									printf("请输入新的学生姓名：");
									scanf("%s",students[i].name);
									printf("学生姓名已成功修改！\n");
									break;
								case 2:
									printf("请输入新的学生年龄：");
									scanf("%d",&students[i].age);
									printf("学生年龄已成功修改！\n");
									break;
								case 3:
								    printf("请输入新的学生班级：");
								    scanf("%d",&students[i].grade);
								    printf("学生班级已成功修改！\n");
								    break;
								
								case 4:
									printf("请输入新的学生学号：");
									scanf("%d",&students[i].ID);
									printf("学生学号已成功修改！\n");
									break;
									
								case 5:
									printf("请输入新的学生语文成绩：");
									scanf("%.1lf",&students[i].Chinese);
									printf("学生语文成绩已成功修改！\n");
									break;
										
								case 6:
									printf("请输入新的学生数学成绩：");
									scanf("%.1lf",&students[i].Math);
									printf("学生数学成绩已成功修改！\n");
									break;
									
								case 7:
									printf("请输入新的学生英语成绩：");
									scanf("%.1lf",&students[i].English);
									printf("学生英语成绩已成功修改！\n");
									break;
									
								case 8:
									printf("请输入新的学生理综成绩：");
									scanf("%.1lf",&students[i].Synthesis);
									printf("学生理综成绩已成功修改！\n");
									break;
								case 0:
									return;	
								default:
									printf("输入错误，请重新输入：\n");
									break;
							}
				
				}
		}
		
	}
	if(!found){
		printf("未找到学号为%d的学生\n",updateID);
		return;
	}
}

// 查找学生信息
void foundStudent() {
    if (studentCount == 0) {
        printf("学生库里没有学生信息，无法查询！\n");
        return;
    }

    int foundID;
    printf("请输入学生学号：");
    scanf("%d", &foundID);

    int found = 0; 
    for (int i = 0; i < studentCount; i++) {
        if (students[i].ID == foundID) {
            found = 1;
            printf("姓名：%s, 年龄：%d, 学号：%d, 语文成绩：%.lf, 数学成绩：%.1f, 英语成绩：%.lf, 理综成绩：%.lf\n",
                   students[i].name, students[i].age, students[i].ID, 
                   students[i].Chinese, students[i].Math, students[i].English, students[i].Synthesis);
            break; 
        }
    }

    if (!found) { // 如果未找到
        printf("未找到学号为 %d 的学生信息！\n", foundID);
    }
}

//显示学生学习
void displayStudent(){
	if(studentCount==0){
		 printf("学生库里没有学生信息，无法显示！\n");
		        return;
	}
	printf("学生信息显示如下：\n");
	for(int i=0;i<studentCount;i++){
   printf("姓名：%s, 年龄：%d, 学号：%d, 语文成绩：%.llf, 数学成绩：%.1lf, 英语成绩：%.llf, 理综成绩：%.llf\n",
                      students[i].name, students[i].age, students[i].ID, 
                      students[i].Chinese, students[i].Math, students[i].English, students[i].Synthesis);
	}
}

//把学生信息写入文件
void writeFile(){
	if(studentCount==0){
	printf("学生库里没有学生信息，无法显示！\n");
	return;
	}
	
	FILE *file=fopen("D://students.txt","wb");
	
	if(!file){
		printf("学生信息写入文件失败！");
		return;
	}
	
	for(int i=0;i<studentCount;i++){
		fprintf(file,"姓名：%s\t年龄：%d\t班级：%d\t学号：%d\t语文成绩：%.1lf\t数学成绩：%.1lf\t英语成绩：%.1lf\t理综成绩:%.1lf\n",
		students[i].name,students[i].age,students[i].grade,students[i].ID,students[i].Chinese,students[i].Math,students[i].English,students[i].Synthesis);
	}
fclose(file);	
printf("学生信息已写入文件！\n");
}

//对学生成绩进行排序(冒泡法)

//语文成绩排序
void Chinesebubble_sort(Student students[],int studentCount){
	int i,j;
	 Student temp;
	for(i=0;i<studentCount-1;i++){
		for(j=0;j<studentCount - 1 - i;j++){
			if(students[j].Chinese < students[j+1].Chinese){
				temp=students[j];
				students[j]=students[j+1];
				students[j+1]=temp;
			}
		}
	}
	printf("排序后的学生语文成绩为：\n");
	for(int i=0;i<studentCount;i++){	
		printf("%s %.0lf\n",students[i].name,students[i].Chinese);
	}
}

//数学成绩排序
void Mathbubble_sort(Student students[],int studentCount){
	int i,j;
	 Student temp;
	for(i=0;i<studentCount-1;i++){
		for(j=0;j<studentCount - 1 - i;j++){
			if(students[j].Math < students[j+1].Math){
				temp=students[j];
				students[j]=students[j+1];
				students[j+1]=temp;
			}
		}
	}
	printf("排序后的学生数学成绩为：\n");
	for(int i=0;i<studentCount;i++){	
		printf("%s %.0lf\n",students[i].name,students[i].Math);
	}
}

//英语成绩排序
void Englishbubble_sort(Student students[],int studentCount){
	int i,j;
	 Student temp;
	for(i=0;i<studentCount-1;i++){
		for(j=0;j<studentCount - 1 - i;j++){
			if(students[j].English < students[j+1].English){
				temp=students[j];
				students[j]=students[j+1];
				students[j+1]=temp;
			}
		}
	}
	printf("排序后的学生英语成绩为：\n");
	for(int i=0;i<studentCount;i++){	
		printf("%s %.0lf\n",students[i].name,students[i].English);
	}
}

//理综成绩排序
void Synthesisbubble_sort(Student students[],int studentCount){
	int i,j;
	 Student temp;
	for(i=0;i<studentCount-1;i++){
		for(j=0;j<studentCount - 1 - i;j++){
			if(students[j].Synthesis < students[j+1].Synthesis){
				temp=students[j];
				students[j]=students[j+1];
				students[j+1]=temp;
			}
		}
	}
	printf("排序后的学生理综成绩为：\n");
	for(int i=0;i<studentCount;i++){	
		printf("%s %.0lf\n",students[i].name,students[i].Synthesis);
	}
}

//总分计算
void calculateTotalScores(){
	for(int i=0;i<studentCount;i++){
		students[i].totalScore=students[i].Chinese+students[i].Math+students[i].English+students[i].Synthesis;
	}
}

//总分排序
void totalbubble_sort(Student students[],int studentCount){
	int i,j;
	Student temp;
	calculateTotalScores();
	for(i=0;i<studentCount-1;i++){
		for(j=0;j<studentCount-1-i;j++){
			if(students[j].totalScore < students[j+1].totalScore){
				temp=students[j];
				students[j]=students[j+1];
				students[j+1]=temp;			
			}
		}
	}
	printf("学生的总成绩如下：\n");
	for(int i=0;i<studentCount;i++){
		printf("%s %.0lf\n",students[i].name,students[i].totalScore);
	}
}
	
	//排序菜单
	void sort(){
		while(1){
		        printf("\n[1] 语文成绩排序\n");
				printf("[2] 数学成绩排序\n");
				printf("[3] 英语成绩排序\n");
				printf("[4] 理综成绩排序\n");
				printf("[5] 总成绩排序\n");
				printf("[0] 返回上一级\n");
				int sortChoice;
				printf("请选择：\n");
				scanf("%d",&sortChoice);
				switch (sortChoice) {
					case 1:
						Chinesebubble_sort(students,studentCount);
						break;
					case 2:
						Mathbubble_sort(students,studentCount);
						break;
					case 3:
						Englishbubble_sort(students,studentCount);
						break;
					case 4:
						Synthesisbubble_sort(students,studentCount);
						break;
					case 5:
						totalbubble_sort(students,studentCount);
						break;	
					case 0:
						return;
					default:
						printf("输入错误，请重新输入：");
						break;
				}
		}
		
	}
	//学生信息菜单
	void menu(){
		while(1){				     	
			        printf("****************************");
			        printf("\n*欢迎来到学生信息管理系统！*\n"); 
			        printf("*[1] 添加学生信息          *\n");    
					printf("*[2] 删除学生信息          *\n");   
					printf("*[3] 修改学生信息          *\n");   
					printf("*[4] 查找学生信息          *\n");    
					printf("*[5] 显示学生信息          *\n");	 				
					printf("*[6] 写入文件              *\n");   
					printf("*[7] 成绩排序              *\n");    
					printf("*[0] 退出系统              *\n");   
					printf("****************************\n");    
					int choice;
					printf("请选择：");
					scanf("%d",&choice);
					switch (choice) {
						case 1:
							addStudent();
							break;
						case 2:
							deleteStudent();
							break;
						case 3:
							updateStudent();
							break;
						case 4:
							foundStudent();
							break;	
						case 5:
							displayStudent();
							break;
						case 6:
							writeFile();
							break;
						case 7:
							sort();
							break;
						case 0:
							printf("退出系统！");
							exit(0);
						default:
						printf("输入错误，请重新输入：\n");
							break;
					}
		}
		
		
	}

int main(){
   menu();
	return 0;
}
